package be.ipl.jack.usecasesimpl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import be.ipl.jack.dao.JoueurDao;
import be.ipl.jack.dao.PartieDao;
import be.ipl.jack.domaine.De;
import be.ipl.jack.domaine.Joueur;
import be.ipl.jack.domaine.Partie;
import be.ipl.jack.usecases.GestionPartie;

@Singleton
@Startup
public class GestionPartieImpl implements GestionPartie {
	@EJB
	private PartieDao partieDao;
	@EJB
	private JoueurDao joueurDao;

	private Partie partie;

	public GestionPartieImpl() {
		
	}

	@PostConstruct
	void init() {
		partie = new Partie("P1");
		partieDao.enregistrer(partie);
	}
	
	@Override
	public boolean rejoindreLaPartie(String pseudo) {
		if (partie == null) {
			partie = new Partie("P1");
			partieDao.enregistrer(partie);
		}
		partie = partieDao.recharger(partie.getId());
		Joueur joueur = partie.getJoueur(pseudo);
		if (joueur == null) {
			joueur = new Joueur(pseudo);
		}
		joueurDao.enregistrer(joueur);
		boolean ok = partie.ajouterJoueur(joueur);
		partieDao.enregistrer(partie);
		return ok;
	}

	@Override
	@Lock(LockType.READ)
	public List<String> listerJoueurs() {
		List<Joueur> joueurs = partie.getJoueurs();
		List<String> pseudos = new ArrayList<String>();
		for (Joueur joueur : joueurs) {
			pseudos.add(joueur.getPseudo());
		}
		return pseudos;
	}

	@Override
	public boolean commencerPartie() {
		partie = partieDao.recharger(partie.getId());
		boolean ok = partie.commencerPartie();
		partieDao.enregistrer(partie);
		return ok;
	}

	@Override
	@Lock(LockType.READ)
	public String joueurCourant() {
		return partie.getJoueurCourant().getPseudo(); 
	}

	@Override
	@Lock(LockType.READ)
	public List<De> listerDesJoues() {
		return partie.getDesJouables();
	}

	@Override
	public int lancerLesDes() {
		partieDao.recharger(partie.getId());
		partie.getDesJouables().size();
		
		return partie.lancerLesDes();
	}

	@Override
	public boolean ecarterDe(int numero) {
		return partie.ecarterDe(numero);
	}

	@Override
	@Lock(LockType.READ)
	public int mesPoints() {
		partieDao.recharger(partie.getId()).getPtsJoueurs().size();
		Joueur courant = partie.getJoueurCourant();
		return partie.getPoints(courant);
	}

	@Override
	@Lock(LockType.READ)
	public int points(String pseudo) {
		Joueur joueur = partie.getJoueur(pseudo);
		return partie.getPoints(joueur);
	}

	@Override
	public boolean auSuivant() {
		return partie.commencerTourSuivant();
	}

	@Override
	@Lock(LockType.READ)
	public String vainqueur() {
		return partie.estVainqueur().getPseudo();
	}

	@Override
	@Lock(LockType.READ)
	public Boolean estFinie() {
		return partie.estFinie();
	}

	@Override
	public void annulerPartie() {
		partie.annuler();
	}

	@Override
	public Joueur getJoueur(String pseudo) {
		return partie.getJoueur(pseudo);
	}
}
